OOP历史:演变自20世纪60年代的
Simula、70年代的SmallTalk、80年代的Clascal以及其他相关语言。C++、Java、Python和Objective-C等现代编程语言都从这个早期的语言中获得了灵感。
3.1 间接
只要在多加一层间接,计算机科学中就没有解决不了的问题。
说明:指的就是面向对象的
多态性。
原理:在程序运行期间,通过指针间接获取某个值,而不是直接获取(指针指向的变化对程序员不可见)。
3.1.1 变量与间接
说明:基本变量就是间接思想的一种实际应用。
1 |
|
3.1.2 使用文件名的间接
说明:程序中使用文件(而不是写死在代码中)也是间接思想的运用。
技巧:xcode中运行程序时提供文件路径的方式
- 打开设置面板:Product(菜单)-> Scheme -> Edit Scheme
- 在面板中添加参数:Arguments -> Arguments Passed On Launch—>点击
+添加
1 |
|
3.2 在面向对象编程中使用间接
说明:
OOP的核心在于使用间接来调用代码(而不是直接调用函数)
3.2.1 过程式编程
说明:在过程式编程中,数据通常保存在简单的数据结构中。要花时间连接数据和用来处理数据的函数。
语言举例:BASIC、C、Tcl和Perl
1 |
|
1 | 2016-01-02 00:50:43.911 3.2.1-procedureOriented[834:55458] drawing a circle at (0 0 30 10) in red |
3.2.2 实现面向对象编程
说明:过程式编程建立在函数之上,数据为函数服务,而面向对象编程则以程序的数据为中心,函数为数据服务。
原理:数据通过间接方式引用相应代码对数据进行操作(数据能够知道如何查找相应的函数)。
id(标识符)
说明:
identifier,是一种泛型,可以用来定义引用任何类型对象的变量。
发送消息
说明:通知对象执行某种操作,也叫做
调用方法
类
说明:不同于其他
OOP系统,在O-C中,如果在运行时改变某个类,则该类的所有对象会自动继承这些变化。
3.3 有关术语
说明:有关
面向对象的术语
| 术语 | 说明 | 语法 | 备注 |
|---|---|---|---|
| 类(class) | 一种表示对象类型的结构体 | 类名首字母大写 | 对象通过它的类来获取自身的各种信息 |
| 对象或实例(object) | 一种包含值和指向其类的隐藏指针的结构体 | 指向对象的变量通常首字母不要大些 | |
| 消息(message) | 对象可以执行的操作,用于通知对象做什么 | ||
| 方法(method) | 响应消息运行的代码 | 根据对象的类,消息可以调用不同的方法 | |
| 方法调度(method dispatcher) | 用于推测执行什么方法以响应某个特定的消息 | ||
| 接口(interface) | 类为对象提供的特性描述 | ||
| 实现(implementation) | 使接口能正常工作的代码 |
3.4 Object-C语言中的OOP
3.4.1 @interface部分
说明:定义类的公共接口,真正运行的代码位于
@implementation中。
用途:在特定类的对象被创建时,为编译器提供有关该类的信息,尤其是对象的数据成员及其提供的功能。
组成:语法上包含以下几个部分
- 继承其它
interface- 实现
protocol- 实例变量
- 方法声明
1 | @interface 类名: 父类名 { |
注意:在声明方法时,如果方法有参数,则需要冒号,否则不需要。
1 | // Circle类 |
3.4.2 @implementation部分
说明:
@implementation是一个编译器指令,表明将为某个类提供代码
- 方法的定义不必按照在
@interface指令中的顺序出现- 可以定义没有在
@interface中声明过的方法- 同一个类中,方法的参数名不可以和实例属性名相同,否则方法被调用时会覆盖实例属性的值
扩展:
- 实例变量名:如果实例变量取一个和方法名相同的名字,
Cocoa还可以发挥出某些神奇的威力- 运行时:
O-C运行时是指用户应用程序时,支持这些应用程序的代码块- self:类的方法被调用时,一个名为
self的秘密隐藏参数将被传递给接受对象,而这个参数引用的就是该接收对象
1 | @implementation Circle |
3.4.3 实例化对象
说明:实例化对象时,需要分配内存,然后将这些内存初始化并保存为有用的默认值。
语法:向相应的类(或已经存在的对象)发送new消息,该类接收并处理完new消息后,我们就会得到一个可以使用的新对象实例。
1 |
|
3.4.4 扩展 Shapes-Object 程序
说明:软件实体应该对扩展开放,而对修改关闭